/*
封装
go语言的类就是通过结构体绑定方法
https://www.bilibili.com/video/BV1gf4y1r79E/?p=18&spm_id_from=pageDriver&vd_source=8bd7b24b38e3e12c558d839b352b32f4
*/
package main

import "fmt"

// 方法或者结构体首字母大写表示该方法或结构体可以被其他包使用
type Hero struct {
	// 若类属性首字母大写，表示该属性可以被外面访问，否则只能够在类的内部访问
	Name  string
	Ad    int
	Level int
}

// 这样写，this是传值
func (this Hero) GetName() string {
	fmt.Println("Name = ", this.Name)
	return this.Name
}

func (this Hero) SetName(newName string) {
	this.Name = newName
}

// 正确的写法
func (this *Hero) GetName2() string {
	//return this->Name// 注意，指针的用法和C/C++不同
	return this.Name
}

func (this *Hero) SetName2(newName string) {
	this.Name = newName
}

func main() {
	hero := Hero{Name: "zhang3", Ad: 100, Level: 1}
	fmt.Printf("%v\n", hero)
	fmt.Println(hero.GetName())
	hero.SetName("liuyang") // 不会成功！
	fmt.Printf("%v\n", hero)
	fmt.Println(hero.GetName())

	// 使用传指针的函数
	fmt.Println("====================")
	hero.SetName2("liuyang")
	fmt.Println(hero.GetName2())
	fmt.Println(hero.GetName())
}
